home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / Apps / ScreenSavers / BackSpaceViews / IvoView.BackModule / IvoView.m < prev    next >
Text File  |  1995-06-12  |  3KB  |  163 lines

  1. //
  2. //  IvoViewPart.m
  3. // Darcy Brockbank, samurai@uriel.cs.mcgill.ca  
  4. // (now samurai@hasc.ca)
  5. //  Adapted from the GlobeSaver module, written by :
  6. //  Ron Blanford, TRW Inc., October 1991.
  7. //
  8.  
  9. #import "IvoView.h"
  10. #import "Thinker.h"
  11. #import <appkit/NXImage.h>
  12. #import <appkit/Panel.h>
  13. #import <libc.h>
  14. #import <appkit/TextField.h>
  15. #import <math.h>
  16. #import <defaults/defaults.h>
  17. #import <sys/file.h>
  18.  
  19. @implementation IvoView
  20.  
  21. - incrementFrame
  22. {
  23.     now = currentTimeInMs();
  24.  
  25.     if (now > nextRotationTime)
  26.     {
  27.     if (++currentFrame >= numberOfFrames) currentFrame = 0;
  28.     nextRotationTime = now + 1000/framesPerSecond;
  29.     }
  30.  
  31.     return self;
  32. }
  33.  
  34. - oneStep
  35. {
  36.     image = [imageList objectAt:currentFrame];
  37.     [self incrementFrame];
  38.     return [super oneStep];
  39. }
  40.  
  41.  
  42. static BOOL noAnimFile = FALSE;
  43.  
  44. #define FRAMES_PER "IvoFramesPerSecond"
  45. #define DEFAULT_FRAMES_PER 14
  46. #define MAX_F 50
  47. #define MIN_F 1
  48.  
  49. - setup
  50. {
  51.     char buf[1024];
  52.     const char * t;
  53.     appowner = BSThinker();
  54.     sprintf(buf,"%s/IvoView.nib",[appowner moduleDirectory:"Ivo"]);
  55.     [NXApp loadNibFile:buf owner:self withNames:NO];
  56.     [self allocateGState];
  57.     imageList = [[List alloc] init];
  58.     if (t=NXReadDefault([NXApp appName],FRAMES_PER)){
  59.         framesPerSecond = atoi(t);
  60.     } else {
  61.         framesPerSecond = DEFAULT_FRAMES_PER;
  62.     }
  63.     [field setIntValue:framesPerSecond];
  64.     [slider setIntValue:framesPerSecond];
  65.     return self;
  66. }
  67.  
  68. - writeFramesDefault:sender;
  69. {
  70.     char buf[32];
  71.     sprintf(buf,"%d",framesPerSecond);
  72.     NXWriteDefault([NXApp appName],FRAMES_PER,buf);
  73.     return self;
  74. }
  75.  
  76. - setFramesPer:sender
  77. {
  78.     
  79.     framesPerSecond = [sender intValue];
  80.     if (framesPerSecond < MIN_F) {
  81.         framesPerSecond = MIN_F;
  82.     } else if (framesPerSecond > MAX_F) {
  83.         framesPerSecond = MAX_F;
  84.     }
  85.     [slider setIntValue:framesPerSecond];
  86.     [field setIntValue:framesPerSecond];
  87.     [self perform:@selector(writeFramesDefault:)
  88.             with:self
  89.             afterDelay:1000
  90.             cancelPrevious:YES];
  91.     return self;
  92. }
  93.  
  94. - initFrame:(NXRect *)frameRect
  95. {
  96.     char animFrame[1024];
  97.     char buf[1024];
  98.     int i, f;
  99.     id local_image;
  100.  
  101.     [super initFrame:frameRect];
  102.     [self setup];
  103.  
  104.     sprintf(buf,"%s/Ivo.anim",[appowner moduleDirectory:"Ivo"]);
  105.     [loadingPanel makeKeyAndOrderFront:self];
  106.     /* construct the image list */
  107.     for (i=0; ; i++) {
  108.         sprintf(animFrame, "%s/Ivo.%d.tiff", buf, i+1);
  109.         if (!(local_image = [NXImage findImageNamed:animFrame]))
  110.         {
  111.             if ((f=open(animFrame, O_RDONLY)) < 0) break;
  112.             close(f);
  113. //            printf("Loading %s\n", animFrame);
  114.             local_image = [[NXImage alloc] initFromFile:animFrame];
  115.             if (local_image == NULL) break;    // never null, even if no file
  116.             if ([local_image lockFocus]){
  117.             [local_image unlockFocus];
  118.             }
  119.             [local_image setName:animFrame];
  120.         }
  121.         //else printf("Using existing %s\n", animFrame);
  122.         [imageList addObject:local_image];
  123.     }
  124.     [loadingPanel orderOut:self];
  125.     numberOfFrames = i;
  126.     currentFrame = 0;
  127.     
  128.     if (numberOfFrames == 0) {
  129.         if (!noAnimFile)
  130.         NXRunAlertPanel([NXApp appName], "Could not open %s",
  131.                 NULL, NULL, NULL, buf);
  132.     noAnimFile = TRUE;
  133.         return NULL;
  134.     }
  135.     
  136.     [super setImage:[imageList objectAt:0]];
  137.     return self;
  138. }
  139.  
  140. // override this method so that Thinker can't set the default image.
  141.  
  142. - setImage:newImage
  143. {
  144.     return self;
  145. }
  146.  
  147.  
  148. - (const char *)windowTitle
  149. {
  150.     return "IvoView";
  151. }
  152.  
  153. - inspector:sender
  154. {
  155.     appowner=sender;
  156.     if (!sharedInspectorPanel){
  157.       [self setup];
  158.     }
  159.     return sharedInspectorPanel;
  160. }
  161.  
  162. @end
  163.